package com.yun.blog.utils;

import io.jsonwebtoken.*;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
 * title        : JwtUtils
 * projectName  : dantouBlog-back
 * description  : Jwt认证工具类
 * author       : simple
 * date         : 2022/11/23下午17:17
 */

public class JwtUtils {

    // token 有效期,12小时
    public static final long EXPIRE = 1000 * 60 * 60 * 12;

    // 签名哈希的密钥，对于不同的加密算法来说含义不同
    public static final String SECRET = "asdSSasdas4545dds78fsdf";

    /**
     * 根据用户名及用户昵称设置token
     *
     * @param username 登录用户名
     * @param name     用户昵称
     * @return java.lang.String token
     **/
    public static String getToken(Integer id, String username, String name) {
        String token = Jwts.builder()
                // 设置token头部信息
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")
                // 设置这个jwt的主题
                .setSubject("user-login")
                // 设置签发时间
                .setIssuedAt(new Date())
                // 设置生效时间，这个时间前验证是无效的
                .setNotBefore(new Date())
                // 设置有效期
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                // 设置主体保存的信息
                .claim("username", username)
                .claim("name", name)
                .claim("id", id)
                // 使用算法和密匙加密
                .signWith(SignatureAlgorithm.HS256, SECRET)
                // 对三段信息进行拼接
                .compact();
        return token;
    }

    /**
     * 验证token是否存在或有效
     *
     * @param token token
     * @return boolean
     **/
    public static boolean checkToken(String token) {
        if (!StringUtils.hasText(token)) {
            return false;
        }
        try {
            Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return false;
        }
        return true;
    }

    /**
     * 验证http请求中的token是否有效
     *
     * @param request
     * @return boolean
     **/
    public static boolean checkToken(HttpServletRequest request) {
        String token = request.getHeader("token");
        return checkToken(token);
    }


    /**
     * 通过token得到用户的id
     *
     * @param token token
     * @return java.lang.Integer
     **/
    public static Integer getMemberIdByToken(String token) {
        if (!StringUtils.hasText(token)) {
            return null;
        }
        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        Integer id = claims.get("id", Integer.class);
        return id;
    }

    /**
     * 通过http请求得到用户的id
     *
     * @param request http请求
     * @return java.lang.Integer
     **/
    public static Integer getMemberIdByToken(HttpServletRequest request) {
        String token = request.getHeader("token");
        return getMemberIdByToken(token);
    }
}
